package com.tarena.charging.device.startup;

import com.alibaba.nacos.common.utils.CollectionUtils;
import com.tarena.charging.device.po.StationPO;
import com.tarena.charging.device.repository.StationRepository;
import java.math.BigDecimal;
import java.util.List;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.data.geo.Point;
import org.springframework.data.redis.core.GeoOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class RedisWarmStartUp implements ApplicationRunner {
    //注入redisTemplate
    @Resource
    @Qualifier("redisTemplate")
    private RedisTemplate redisTempalte;
    @Autowired //仓储层 和持久层 统称数据层 每一个数据表格都有一套 数据层
    private StationRepository stationRepository;
    @Override public void run(ApplicationArguments args) throws Exception {
        log.info("当前预热run方法运行了");
        //1.读取所有站场信息
        List<StationPO> pos= stationRepository.getAll();
        //2.非空的pos的时候
        if (CollectionUtils.isNotEmpty(pos)){
            log.info("从数据库查询到数据");
            //非空循环写入到redis geo
            for (StationPO po : pos) {
                saveStationGeo(po);
            }
        }else{
            //未找到站场数据
            log.info("未找到站场数据");
        }
    }

    private void saveStationGeo(StationPO po) {
        //从po 拿出3个属性 存储redis 数据 lng lat stationName
        BigDecimal lng = po.getStationLng();
        BigDecimal lat = po.getStationLat();
        String stationName = po.getStationName();
        //获取操作geo类型的子对象
        GeoOperations stationGeo = redisTempalte.opsForGeo();
        Point point=new Point(lng.doubleValue(),lat.doubleValue());
        stationGeo.add("charging_geo",point,stationName);
    }
}
